package com.lyw.i08callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * Runnable 和 Callable 接口的区别
 *    - 不同包下
 *    - runnable 没有返回值 ；callable 有返回值
 *    - runnable 不会抛出异常；callable 如果不能计算最终结果会抛出异常
 *    - 实现的方法名称不同， 一个是 run() 另一个是 call()
 *    - Callable 接口还支持返回值的范型
 *
 * 2、FutureTask 的方法 get() 第一次调用的时候是需要计算的，之后都是直接返回
 *
 * @author lyw
 * @Date 2023/7/10-下午3:12
 */

class MyThread1 implements Runnable {
  @Override
  public void run() {
    System.out.println("runnable is run!");
  }
}

class MyThread2 implements Callable<Integer> {
  @Override
  public Integer call() throws Exception {
    System.out.println("callable is run!");
    return 21522;
  }
}
public class CallableDemo {

  public static void main(String[] args) throws ExecutionException, InterruptedException {
    new Thread(new MyThread1(), "AA").start();
    FutureTask<Integer> task = new FutureTask<>(new MyThread2());
    new Thread(task, "BB").start();
    System.out.println("callable return value is " + task.get());
  }
}
